home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / pdc / make / rules.c < prev   
C/C++ Source or Header  |  1990-04-19  |  7KB  |  302 lines

  1. /*
  2.  *    Control of the implicit suffix rules
  3.  */
  4.  
  5.  
  6. #include "h.h"
  7. #ifndef NULL
  8. #define NULL ((void *) 0)
  9. #endif
  10.  
  11. /*
  12.  *    To customize, set the following according to your preferences and
  13.  *    modify the default rules installed in makerules().
  14.  */
  15.  
  16. #ifdef unix
  17. #define DEF_COMPILER "cc"
  18. #define DEF_ASSEMBLER "as"
  19. #define DEF_CFLAGS   "-O"
  20. #define DEF_PARSEGEN "yacc"
  21. #define DEF_YFLAGS   ""
  22. #define DEF_MV       "mv"
  23. #define DEF_RM       "rm"
  24. #endif
  25.  
  26. #ifdef amiga
  27. #define DEF_COMPILER "ccx"
  28. #define DEF_ASSEMBLER "a68k"
  29. #define DEF_CFLAGS   ""
  30. #define DEF_PARSEGEN "bison"
  31. #define DEF_YFLAGS   ""
  32. #define DEF_MV       "rename"
  33. #define DEF_RM       "delete"
  34. #endif
  35.  
  36. #ifdef os9
  37. #define DEF_COMPILER "cc"
  38. #define DEF_CFLAGS   "-z"
  39. #endif
  40.  
  41. /*
  42.  * Return a pointer to the suffix of a name 
  43.  */
  44. char           *
  45. suffix(name)
  46.     char           *name;
  47. {
  48.     return rindex(name, '.');
  49. }
  50.  
  51.  
  52. /*
  53.  *    Dynamic dependency.  This routine applies the suffis rules
  54.  *    to try and find a source and a set of rules for a missing
  55.  *    target.  If found, np is made into a target with the implicit
  56.  *    source name, and rules.  Returns TRUE if np was made into
  57.  *    a target.
  58.  */
  59. bool
  60. dyndep(np)
  61.     struct name    *np;
  62. {
  63.     register char  *p;
  64.     register char  *q;
  65.     register char  *suff;    /* Old suffix  */
  66.     register char  *basename;    /* Name without suffix  */
  67.     struct name    *op;        /* New dependent  */
  68.     struct name    *sp;        /* Suffix  */
  69.     struct line    *lp;
  70.     struct depend  *dp;
  71.     char           *newsuff;
  72.     void        modtime();
  73.  
  74.  
  75.     p = str1;
  76.     q = np->n_name;
  77.     if (!(suff = suffix(q)))
  78.     return FALSE;        /* No suffix */
  79.     while (q < suff)
  80.     *p++ = *q++;
  81.     *p = '\0';
  82.     basename = setmacro("*", str1)->m_val;
  83.  
  84.     if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
  85.     return FALSE;
  86.  
  87.     for (lp = sp->n_line; lp; lp = lp->l_next)
  88.     for (dp = lp->l_dep; dp; dp = dp->d_next) {
  89.         newsuff = dp->d_name->n_name;
  90.         if (strlen(suff) + strlen(newsuff) + 1 >= LZ)
  91.         fatal("Suffix rule too long");
  92.         p = str1;
  93.         q = newsuff;
  94.         while (*p++ = *q++);
  95.         p--;
  96.         q = suff;
  97.         while (*p++ = *q++);
  98.         sp = newname(str1);
  99.         if (sp->n_flag & N_TARG) {
  100.         p = str1;
  101.         q = basename;
  102.         if (strlen(basename) + strlen(newsuff) + 1 >= LZ)
  103.             fatal("Implicit name too long");
  104.         while (*p++ = *q++);
  105.         p--;
  106.         q = newsuff;
  107.         while (*p++ = *q++);
  108.         op = newname(str1);
  109.         if (!op->n_time)
  110.             modtime(op);
  111.         if (op->n_time) {
  112.             dp = newdep(op, NULL);
  113.             newline(np, dp, sp->n_line->l_cmd, 0);
  114.             setmacro("<", op->n_name);
  115.             return TRUE;
  116.         }
  117.         }
  118.     }
  119.     return FALSE;
  120. }
  121.  
  122.  
  123. /*
  124.  *    Make the default rules
  125.  */
  126. void
  127. makerules()
  128. {
  129.     struct cmd     *cp;
  130.     struct name    *np;
  131.     struct depend  *dp;
  132.  
  133.  
  134. #ifdef eon
  135.     setmacro("BDSCC", "asm");
  136.     /* setmacro("BDSCFLAGS", "");     */
  137.     cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", 0);
  138.     np = newname(".c.o");
  139.     newline(np, 0, cp, 0);
  140.  
  141.     setmacro("CC", "c");
  142.     setmacro("CFLAGS", "-O");
  143.     cp = newcmd("$(CC) $(CFLAGS) -c $<", 0);
  144.     np = newname(".c.obj");
  145.     newline(np, 0, cp, 0);
  146.  
  147.     setmacro("M80", "asm -n");
  148.     /* setmacro("M80FLAGS", "");     */
  149.     cp = newcmd("$(M80) $(M80FLAGS) $<", 0);
  150.     np = newname(".mac.o");
  151.     newline(np, 0, cp, 0);
  152.  
  153.     setmacro("AS", "zas");
  154.     /* setmacro("ASFLAGS", "");     */
  155.     cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", 0);
  156.     np = newname(".as.obj");
  157.     newline(np, 0, cp, 0);
  158.  
  159.     np = newname(".as");
  160.     dp = newdep(np, 0);
  161.     np = newname(".obj");
  162.     dp = newdep(np, dp);
  163.     np = newname(".c");
  164.     dp = newdep(np, dp);
  165.     np = newname(".o");
  166.     dp = newdep(np, dp);
  167.     np = newname(".mac");
  168.     dp = newdep(np, dp);
  169.     np = newname(".SUFFIXES");
  170.     newline(np, dp, 0, 0);
  171. #endif
  172.  
  173. /*
  174.  *    Some of the UNIX implicit rules
  175.  */
  176. #ifdef unix
  177.     setmacro("CC", DEF_COMPILER);
  178.     setmacro("CFLAGS", DEF_CFLAGS);
  179.     cp = newcmd("$(CC) $(CFLAGS) -c $<", 0);
  180.     np = newname(".c.o");
  181.     newline(np, 0, cp, 0);
  182.  
  183.     setmacro("AS", DEF_ASSEMBLER);
  184.     cp = newcmd("$(AS) -o $@ $<", 0);
  185.     np = newname(".s.o");
  186.     newline(np, 0, cp, 0);
  187.  
  188.     setmacro("YACC", DEF_PARSEGEN);
  189.     setmacro("MV", DEF_MV);
  190.     setmacro("RM", DEF_RM);
  191.     setmacro("YFLAGS", DEF_YFLAGS);
  192.     cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  193.     cp = newcmd("$(MV) y.tab.c $@", cp);
  194.     np = newname(".y.c");
  195.     newline(np, 0, cp, 0);
  196.  
  197.     cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  198.     cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
  199.     cp = newcmd("$(RM) y.tab.c", cp);
  200.     cp = newcmd("$(MV) y.tab.o $@", cp);
  201.     np = newname(".y.o");
  202.     newline(np, 0, cp, 0);
  203.  
  204.     np = newname(".s");
  205.     dp = newdep(np, 0);
  206.     np = newname(".o");
  207.     dp = newdep(np, dp);
  208.     np = newname(".c");
  209.     dp = newdep(np, dp);
  210.     np = newname(".y");
  211.     dp = newdep(np, dp);
  212.     np = newname(".SUFFIXES");
  213.     newline(np, dp, 0, 0);
  214. #endif
  215. #ifdef os9
  216. /*
  217.  *    Fairlight use an enhanced version of the C sub-system.
  218.  *    They have a specialised macro pre-processor.
  219.  */
  220.     setmacro("CC", COMPILER);
  221.     setmacro("CFLAGS", DEF_CFLAGS);
  222.     cp = newcmd("$(CC) $(CFLAGS) -r $<", 0);
  223.  
  224.     np = newname(".c.r");
  225.     newline(np, 0, cp, 0);
  226.     np = newname(".ca.r");
  227.     newline(np, 0, cp, 0);
  228.     np = newname(".a.r");
  229.     newline(np, 0, cp, 0);
  230.     np = newname(".o.r");
  231.     newline(np, 0, cp, 0);
  232.     np = newname(".mc.r");
  233.     newline(np, 0, cp, 0);
  234.     np = newname(".mca.r");
  235.     newline(np, 0, cp, 0);
  236.     np = newname(".ma.r");
  237.     newline(np, 0, cp, 0);
  238.     np = newname(".mo.r");
  239.     newline(np, 0, cp, 0);
  240.  
  241.     np = newname(".r");
  242.     dp = newdep(np, 0);
  243.     np = newname(".mc");
  244.     dp = newdep(np, dp);
  245.     np = newname(".mca");
  246.     dp = newdep(np, dp);
  247.     np = newname(".c");
  248.     dp = newdep(np, dp);
  249.     np = newname(".ca");
  250.     dp = newdep(np, dp);
  251.     np = newname(".ma");
  252.     dp = newdep(np, dp);
  253.     np = newname(".mo");
  254.     dp = newdep(np, dp);
  255.     np = newname(".o");
  256.     dp = newdep(np, dp);
  257.     np = newname(".a");
  258.     dp = newdep(np, dp);
  259.     np = newname(".SUFFIXES");
  260.     newline(np, dp, 0, 0);
  261. #endif
  262. #ifdef amiga
  263.     setmacro("CC", DEF_COMPILER);
  264.     setmacro("CFLAGS", DEF_CFLAGS);
  265.     cp = newcmd("$(CC) $(CFLAGS) -c $<", NULL);
  266.     np = newname(".c.o");
  267.     newline(np, NULL, cp, 0);
  268.  
  269.     setmacro("AS", DEF_ASSEMBLER);
  270.     cp = newcmd("$(AS) -o$@ $<", NULL);
  271.     np = newname(".s.o");
  272.     newline(np, NULL, cp, NULL);
  273.  
  274.     setmacro("YACC", DEF_PARSEGEN);
  275.     setmacro("MV", DEF_MV);
  276.     setmacro("RM", DEF_RM);
  277.     setmacro("YFLAGS", DEF_YFLAGS);
  278.     cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  279.     cp = newcmd("rename y.tab.c $@", cp);
  280.     np = newname(".y.c");
  281.     newline(np, 0, cp, 0);
  282.  
  283.     cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  284.     cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
  285.     cp = newcmd("$(RM) y.tab.c", cp);
  286.     cp = newcmd("$(MV) y.tab.o $@", cp);
  287.     np = newname(".y.o");
  288.     newline(np, 0, cp, 0);
  289.  
  290.     np = newname(".o");
  291.     dp = newdep(np, NULL);
  292.     np = newname(".s");
  293.     dp = newdep(np, dp);
  294.     np = newname(".c");
  295.     dp = newdep(np, dp);
  296.     np = newname(".y");
  297.     dp = newdep(np, dp);
  298.     np = newname(".SUFFIXES");
  299.     newline(np, dp, NULL, 0);
  300. #endif
  301. }
  302.